Skip to content

Release 0.4.0 - #197

Merged
overwrite00 merged 30 commits into
mainfrom
develop
Nov 2, 2026
Merged

overwrite00 merged 30 commits into
mainfrom
develop

Conversation

@overwrite00

@overwrite00 overwrite00 commented Nov 2, 2026 •

Copy link
Copy Markdown
Owner

Promotes 0.4.0 to stable.

  • python/config.py, electron/ and frontend/ package files and lockfiles are all at 0.4.0.
  • CHANGELOG.md has the ## [0.4.0] — 2026-11-02 section (release notes extracted by scripts/changelog_notes.py); the Roadmap stays under [Unreleased].
  • A matching beta exists (v0.4.0-beta.7), so the find-latest-beta gate passes.
  • Suites on develop: pytest 1364 passed / 14 skipped, frontend 92/92, electron 27/27.

overwrite00 and others added 24 commits October 29, 2026 19:13
The PyInstaller sidecar embeds the build image's glibc, so ubuntu-latest moving
to 26.04 would break the Linux packages on 24.04. Build .deb/.tar.gz per Ubuntu
LTS and the .rpm inside rockylinux:9.
…r.gz

Packages built on ubuntu-24.04 need glibc 2.38 and do not start on Debian 12
or Ubuntu 22.04. Build the sidecar once in rockylinux:9 (glibc 2.34) and reuse
it, replacing the Ubuntu 24/26 matrix. Update docs and changelog.
Add a user-initiated (or opt-in at startup) update check against the GitHub
Releases API, run entirely in the Electron main process. Stable builds see
only newer stable releases; beta builds also see newer betas. The update
panel shows release notes, release page, ignore/unignore and, on Windows
installed builds, a cancellable download with size and SHA-256 verification
before the installer is started.

The About dialog links to the repository and closes with Esc. Fix the
menu-listener cleanup reading window.electronAPI at unmount, and correct
docs that claimed About reads the version from /health. Privacy docs now
say offline by default.

[skip ci]
…te and sync

- Typed canonical values, stable keys and an editable/deletable contract per field,
  with idempotent writes, round-trip and read-after-write verification (422 lossy_write)
- Single verified atomic transaction per /write, /delete and /undo; identical saves
  leave the file untouched
- POST /undo with an in-memory journal; byte-identical restore through a byte patch,
  falling back to the stored values; chains survive saves that move the mtime
- IPTC/XMP read and write for JPEG with a segment writer, IPTC <-> XMP twins kept in
  step in the same transaction, digest refreshed only when every pair agrees; a
  mirrored delete keeps a twin that holds other language alternatives
- Own codecs for EXIF, MP4 and ID3/Vorbis/ASF tags, PDF XMP and Office packages;
  hachoir as read-only fallback with an explicit read-only reason
- Uniform error body, 503 file_busy for concurrent reads, Windows fixes (hidden
  files, DACL, pre-1970 mtime)
- Typed editor with field addition, token-based Undo and notices in the renderer;
  integers beyond 2^53 handled exactly
- Runtime and dev requirements split; test-python-windows CI job
- Docs and changelog aligned with the real behaviour
…o 32 bits

Hosted Linux runners store 1900-01-01 as 1901-12-13; the sidecar correctly reports
a lossy write there, so the tests cannot apply. They still run where the
filesystem keeps the date (Windows, most local setups).
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.38.2 to 4.39.1.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@v4.38.2...v4.39.1)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.39.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [pypdf](https://github.com/py-pdf/pypdf) from 6.21.2 to 6.21.4.
- [Release notes](https://github.com/py-pdf/pypdf/releases)
- [Changelog](https://github.com/py-pdf/pypdf/blob/main/CHANGELOG.md)
- [Commits](py-pdf/pypdf@6.21.2...6.21.4)

---
updated-dependencies:
- dependency-name: pypdf
  dependency-version: 6.21.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) from 1.4.0 to 1.4.1.
- [Release notes](https://github.com/pytest-dev/pytest-asyncio/releases)
- [Commits](pytest-dev/pytest-asyncio@v1.4.0...v1.4.1)

---
updated-dependencies:
- dependency-name: pytest-asyncio
  dependency-version: 1.4.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [pytest](https://github.com/pytest-dev/pytest) from 9.1.1 to 9.2.0.
- [Release notes](https://github.com/pytest-dev/pytest/releases)
- [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst)
- [Commits](pytest-dev/pytest@9.1.1...9.2.0)

---
updated-dependencies:
- dependency-name: pytest
  dependency-version: 9.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [react-dom](https://github.com/react/react/tree/HEAD/packages/react-dom) from 19.3.0 to 19.3.1.
- [Release notes](https://github.com/react/react/releases)
- [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/react/react/commits/v19.3.1/packages/react-dom)

---
updated-dependencies:
- dependency-name: react-dom
  dependency-version: 19.3.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) from 1.48.0 to 1.65.0.
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/1.65.0/packages/lucide-react)

---
updated-dependencies:
- dependency-name: lucide-react
  dependency-version: 1.64.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [electron](https://github.com/electron/electron) from 44.9.3 to 45.1.0.
- [Release notes](https://github.com/electron/electron/releases)
- [Commits](electron/electron@v44.9.3...v45.1.0)

---
updated-dependencies:
- dependency-name: electron
  dependency-version: 45.1.0
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…end (#195)

Bumps [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) from 6.1.1 to 6.1.2.
- [Release notes](https://github.com/vitejs/vite-plugin-react/releases)
- [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.1.2/packages/plugin-react)

---
updated-dependencies:
- dependency-name: "@vitejs/plugin-react"
  dependency-version: 6.1.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [fastapi](https://github.com/fastapi/fastapi) from 0.141.1 to 0.162.0.
- [Release notes](https://github.com/fastapi/fastapi/releases)
- [Commits](fastapi/fastapi@0.141.1...0.162.0)

---
updated-dependencies:
- dependency-name: fastapi
  dependency-version: 0.162.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
@overwrite00 overwrite00 self-assigned this Nov 2, 2026
Comment thread frontend/test/updates.test.jsx Fixed
Comment thread frontend/test/updates.test.jsx Fixed

@github-advanced-security github-advanced-security AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CodeQL found more than 20 potential problems in the proposed changes. Check the Files changed tab for more details.

Comment thread python/api/routes.py Fixed
Comment thread python/core/errors.py Fixed
Comment thread python/core/handlers/_mp4_codec.py Fixed
Comment thread python/core/path_security.py Fixed
Comment thread python/core/path_security.py Fixed
Comment thread python/core/path_security.py Fixed
Comment thread python/core/values.py Fixed
Comment thread python/tests/factories/fs.py Fixed
Comment thread python/tests/test_undo.py Resolved
Comment thread python/tests/test_audio_handler.py Resolved
Comment thread python/tests/test_undo.py Outdated
@pytest.mark.asyncio
async def test_io_error_during_the_byte_patch_falls_back_to_the_values(client, tmp_path, monkeypatch):
"""B3: a failure after the patch started writing must not leave a half patched file."""
import api.byte_patch as byte_patch
Comment thread python/tests/test_undo.py Outdated
assert path.read_bytes() == before
_no_leftovers(path)
jsonfake.lose_on_restore = None
body = _ok(await _undo(client, token))
Comment thread python/tests/test_atomic_windows.py Outdated
@windows_only
@pytest.mark.asyncio
async def test_api_write_on_locked_file_is_503_file_busy(client, tmp_path, monkeypatch):
import core.path_security as security
Comment thread python/tests/test_atomic_windows.py Resolved
Comment thread python/tests/test_atomic_windows.py Outdated

@windows_only
def test_attributes_applied_to_target_when_replace_drops_them(tmp_path, monkeypatch):
import core.path_security as security
Comment thread python/tests/test_api_contract.py Outdated
count.append(args[0])
return real(*args, **kwargs)
monkeypatch.setattr(routes, "secure_atomic_write", counting)
import core.base_handler as base
Comment thread python/tests/test_api_contract.py Resolved
Comment thread python/tests/test_api_contract.py Outdated
import pytest
from httpx import ASGITransport, AsyncClient

import api.routes as routes
Comment thread python/tests/test_error_descriptions.py Outdated
def test_post_commit_warnings_do_not_leak_the_exception_text(tmp_path, monkeypatch):
"""A failure while restoring metadata after the commit is reported with a fixed
description; the detail (here a path) goes to the log only."""
import core.path_security as security
@overwrite00
overwrite00 merged commit debf206 into main Nov 2, 2026
24 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants